/*
  愤怒的奶牛
  题目描述
    Farmer John 建造了一个有 N (2 <= N <= 100,000) 个隔间的牛棚，
    这些隔间分布在一条直线上，坐标是 x1, ... , xN (0 <= xi <= 1,000,000,000)。
    他的 C (2 <= C <= N) 头牛不满于隔间的位置分布，它们为牛棚里其他的牛的存在而愤怒。
    为了防止牛之间的互相打斗，Farmer John 想把这些牛安置在指定的隔间，所有牛中相邻两头的最近距离越大越好。
    那么，这个最大的最近距离是多少呢？
  输入格式
    第 1 行：两个用空格隔开的数字 N 和 C。
    第 2 ~ N+1 行：每行一个整数，表示每个隔间的坐标。
  输出格式
    输出只有一行，即相邻两头牛最大的最近距离。
  输入数据 1
    5 3
    1
    2
    8
    4
    9
  输出数据 1
    3
*/

#include <bits/stdc++.h>

using namespace std;

/*
  思路:
    通常采用二分答案算法的话, 需要首先明确 2 个核心问题:
      1) 答案的取值范围(区间)，即确定区间的最大值和最小值
      2) 判断某个答案是否满足题意(条件)的判定方法
    解答本题时，先明确出这 2 个问题:
      1）答案的取值范围(区间)
          区间的最小值为相邻 2 个牛棚之间的最小距离；
          区间的最大值为坐标最小的牛棚和坐标最大的牛棚之间的距离；
      2) 判断某个答案是否满足题意的判定方法:
          首先计算出：以该答案(高度)进行砍树，可以得到的木材的总长度；
          如果得到的木材总长度数大于等于 m，则该答案满足题目要求；
          否则，则该答案不满题目要求!
*/

int n, c;
int a[100001] = {}; // a[i] 表示第 i 个牛棚的坐标 (其中 i > 0)
int e, s = 0;       // s(start) 表示二分答案算法实现中进行二分查找时的开始边界(左边界)
                    // e(end)   表示二分答案算法实现中进行二分查找时的结束边界(右边界)

// 该函数用来判断输入 x(表示答案，即 2 头牛之间的最小间隔) 是否满足条件(题目要求)
bool check(int x) {
    int num = 0;  // 表示: 以 x 为最小间隔，总共能放(安置)几头牛
    int cnt = 1;  // 记录上一头牛被放(安置)在哪个牛棚，即记录牛棚对应的编号

    /*
      先依据答案计算出：以 x 为最小间隔，能往牛棚中放(安置)几头牛
      计算方法:
        将第 1 头牛放在最左侧的牛棚(假设最左侧的牛棚坐标最小，
        并以 x 为最小间隔，往牛棚中放(安置)牛，
        遍历完所有牛棚后，看总共放(安置)了几头牛。
      如果安置的牛的个数大于等于 m，则说明该答案满足条件；
      反之，则说明答案满足条件!
    */
    for (int i = 2; i <= n; i++) {
        if (a[i] - a[cnt] >= x) {
            num++;
            cnt = i;
        }
    }
    return num >= c - 1;
}

int main() {
    cin >> n >> c;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];  // 从命令行输入第 i 个牛棚的坐标
    }
    sort(a + 1, a + n + 1); // 对牛棚的坐标按从小到大的数序进行排序

    for (int i = 1; i <= n; i++) {
        if (a[i] - a[i - 1] < s) {
            s = a[i] - a[i - 1];  // 二分查找时开始边界(左边界)，即 2 头牛之间的最小间隔的取值范围(区间)的最小值为
                                  // 相邻 2 个牛棚之间的最近距离
        }
    }

    /*
      用二分查找法，在答案的区间范围内，查找满足题目要求的最大值
    */
    int ans = 0;  // 答案, 即 2 头牛之间的最近距离
    e = a[n] - a[1];  // 二分查找时答案区间的最大值为: 坐标最小的牛棚和坐标最大的牛棚之间的距离
    while (s <= e) {
        int mid = (s + e) / 2;
        if (check(mid)) {
            ans = mid;
            s = mid + 1;  // 由于需要答案尽可能地大，所以我们进一步从 mid 的右半区间进行查找
        } else {
            e = mid - 1;  // mid 不满足题目要求，从 mid 的左半区间进行查找
        }
    }
    cout << ans;

    return 0;
}